package string;

public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc"; //会创建对象
        String s2 = "123abc"; //重用s1对象，s2保存的地址与s1相同
        System.out.println("s1:"+s1); //s1:123abc
        System.out.println("s2:"+s2); //s2:123abc
        System.out.println(s1==s2); //true

        System.out.println("--------------------------------");

        String s3 = "123b=abc";
        System.out.println("s3:"+s3); //s3:123b=abc
        System.out.println(s1==s3); //false

        System.out.println("--------------------------------");

        //new一定创建新对象，并不推荐这样的做法
        String s4 = new String("123abc");
        System.out.println("s4:"+s4); //s4:123abc
        System.out.println(s1==s4); //false

        System.out.println("---------------------------------");

        /*
            触发了编译器的与计算特性：
            编译器编译代码时如果爱编译期间可以确定一个计算表达式的结果时就会进行计算，并将结果替换这个表达式，
            例如下面的代码：
            String s5 = "123"+"abc";
            会被编译器改为：
            String s5 = "123abc";//class文件中的样子，因此s5会重用对象
         */
        String s5 = "123"+"abc";
        System.out.println("s5:"+s5); //s5:123abc
        System.out.println(s1==s5); //true

        System.out.println("----------------------------------");

        String s = "123";
        String s6 = s + "abc";
        System.out.println("s6:"+s6); //s6:123abc
        System.out.println(s1==s6); //false

        System.out.println("----------------------------------");

        s1 = s1 + "!";
        System.out.println("s1:"+s1); //s1:123abc!
        System.out.println("s2:"+s2); //s2:123abc
        System.out.println(s1==s2); //false 地址不同了
    }
}








